package com.lfy.fyadmin.util;

import org.springframework.util.DigestUtils;
import java.security.SecureRandom;
import java.util.Base64;

/**
 * 密码工具类
 */
public class PasswordUtil {

    private static final SecureRandom RANDOM = new SecureRandom();
    private static final int SALT_LENGTH = 16;

    /**
     * 生成随机盐值
     * @return 盐值字符串
     */
    public static String generateSalt() {
        byte[] salt = new byte[SALT_LENGTH];
        RANDOM.nextBytes(salt);
        return Base64.getEncoder().encodeToString(salt);
    }

    /**
     * 使用MD5加密密码
     * @param password 原始密码
     * @param salt 盐值
     * @return 加密后的密码
     */
    public static String encryptPassword(String password, String salt) {
        if (password == null || salt == null) {
            throw new IllegalArgumentException("密码和盐值不能为空");
        }
        
        // 将密码和盐值组合后进行MD5加密
        String combined = password + salt;
        return DigestUtils.md5DigestAsHex(combined.getBytes());
    }

    /**
     * 验证密码是否正确
     * @param inputPassword 输入的密码
     * @param storedPassword 存储的加密密码
     * @param salt 盐值
     * @return 密码是否正确
     */
    public static boolean verifyPassword(String inputPassword, String storedPassword, String salt) {
        if (inputPassword == null || storedPassword == null || salt == null) {
            return false;
        }
        
        String encryptedInput = encryptPassword(inputPassword, salt);
        return encryptedInput.equals(storedPassword);
    }

    /**
     * 验证密码强度
     * @param password 密码
     * @return 是否符合强度要求
     */
    public static boolean isPasswordStrong(String password) {
        if (password == null || password.length() < 6 || password.length() > 20) {
            return false;
        }
        
        // 检查是否包含数字
        boolean hasDigit = password.matches(".*\\d.*");
        // 检查是否包含字母
        boolean hasLetter = password.matches(".*[a-zA-Z].*");
        
        return hasDigit && hasLetter;
    }

    /**
     * 检查新密码是否与旧密码相同
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @return 是否相同
     */
    public static boolean isSamePassword(String oldPassword, String newPassword) {
        return oldPassword != null && oldPassword.equals(newPassword);
    }
}